_require "../../basis.smi"
_require "./json.smi"
_require "./json-source.smi"
_require local "./json.lex.smi"
_require local "./json-tokens.smi"

structure JSONStreamParser =
struct
  type source = JSONSource.source
  val openStream : TextIO.instream -> source
  val openFile : string -> source
  val openString : string -> source
  val close : source -> unit
  type 'ctx callbacks =
      {null : 'ctx -> 'ctx,
       boolean : 'ctx * bool -> 'ctx,
       integer : 'ctx * IntInf.int -> 'ctx,
       float : 'ctx * real -> 'ctx,
       string : 'ctx * string -> 'ctx,
       startObject : 'ctx -> 'ctx,
       objectKey : 'ctx * string -> 'ctx,
       endObject : 'ctx -> 'ctx,
       startArray : 'ctx -> 'ctx,
       endArray : 'ctx -> 'ctx,
       error : 'ctx * string -> unit}
  val parse : 'ctx callbacks -> (source * 'ctx) -> 'ctx
  val parseFile : 'ctx callbacks -> (string * 'ctx) -> 'ctx
end
